package com.shujia.wyh.day28;

import java.lang.reflect.Constructor;

/*
        如何通过反射获取Class文件对象并使用其中的构造方法创建对象呢？
 */
public class ReflexDemo2 {
    public static void main(String[] args) throws Exception {
        //获取Person类的Class文件对象
        Class<?> c1 = Class.forName("com.shujia.wyh.day28.Person");

        //获取Class文件对象中的构造方法
        //public Constructor<?>[] getConstructors() throws SecurityException
        // 返回一个包含Constructor对象的数组，反映由此Constructor对象表示的类的所有公共类函数
        Constructor<?>[] cons = c1.getConstructors();
        for (Constructor c : cons) {
            System.out.println(c);
        }
        System.out.println("==========================================");
        //public Constructor<?>[] getDeclaredConstructors() throws SecurityException
        // 返回反映Constructor对象表示的类声明的所有Constructor对象的数组类
        //获取的是该类中的所有构造方法，包括私有，被保护的，默认的，公共的
        Constructor<?>[] cons2 = c1.getDeclaredConstructors();
        for (Constructor c : cons2) {
            System.out.println(c);
        }
        System.out.println("==========================================");
        //获取单个构造方法
        //Constructor<T> getConstructor(类<?>... parameterTypes)
        //返回一个 Constructor对象，该对象反映 Constructor对象表示的类的指定的公共 类函数。
        Constructor<?> con1 = c1.getConstructor(String.class);
        System.out.println(con1);
        //获取单个私有的带参数的构造方法
//        Constructor<?> con2 = c1.getConstructor(String.class, int.class);
//        System.out.println(con2);
        Constructor<?> con2 = c1.getDeclaredConstructor(String.class, int.class);
        System.out.println(con2);
        System.out.println("=============================================");
        //使用公共的构造方法创建对象
        //T newInstance(Object... initargs)
        //使用此 Constructor对象表示的构造函数，使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
        Object o = con1.newInstance("张三");
        System.out.println(o);
        //向下转型
        Person p = (Person) o;
        p.eat("汉堡");


    }
}
